“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。
地址:https://zhuanlan.zhihu.com/p/382746788 大家好!在这篇文章里我将为大家简要介绍我们在ICRA2021上发表的论文"CodeVIO: Visual-Inertial Odometry with Learned Optimizable Dense Depth" ,很荣幸这个工作获得了同行评审专家的认可,获得了机器视觉最佳论文提名。 https://www.bilibili.com/video/BV1Mf4y1e7c6 https://arxiv.org/abs/2012.10133 01
首先,实时的单目重建在很多种场景中都是需要的,如 AR/VR,自主导航机器人等。但是,仅依赖于单目的系统无法重建出具有真实尺度的场景。CodeVIO希望通过使用单目相机和IMU进行实时的稠密重建。
图1. ARCore Depth Lab 中展示的稠密深度的应用场景
CodeVIO的主要贡献在于提出了将可优化的网络学出来的稠密深度与轻量的EKF-VIO共同估计的方式,并为提高系统的效率和精度提出了很多算法模块。CodeVIO中紧耦合了深度神经网络和VIO状态估计器,可进行有尺度的稠密重建。 需要明确的是稠密深度图的维度是很高的,逐点地调整稠密深度图是非常耗时的,如224*224的图像就有约5万个深度值需要调整。为了在轻量的EKF滤波器中,调整稠密的深度图,我们借鉴了CodeSLAM[1]的思想--将稠密的深度编码成低维度的潜变量Depth Code,并通过调整Depth Code来调整稠密深度图。
图2. CodeSLAM中将稠密深度表示为低维度的Depth code c
CodeSLAM 中使用如图2的CVAE神经网络,上部为Unet 分支, 下部为VAE分支。Unet输入单帧图像预测Depth Uncertainty并提供features给VAE分支。将VAE中的Decoder表示为可微分的函数 ,那么稠密深度图与Depth code之间的关系可以描述为 。这允许我们在状态估计器中使用测量,并通过更新Depth code 来调整稠密深度图 。当然,若要更新Depth code ,则需要稠密深度 对其的雅可比矩阵(神经网络Decoder的雅可比)。 02
System Overview of CodeVIO
图3. CodeVIO 预测初始的稠密深度
CodeVIO主要包括CVAE和MSCKF VIO[2]两部分。CVAE的输入为单目图像和从VIO获得的Sparse Depth (由于IMU的使用,Sparse Depth是有尺度的,因此CVAE可预测出有尺度的稠密深度)。通过使用图像和Sparse depth中的信息,并使用Zero Depth Code可以预测出初始的稠密深度。 在 VIO 状态估计器中将对初始的稠密深度进行调整,这是通过调整Deth Code实现的。状态估计器中同时调整导航状态和Depth Code,并输出下一时刻的Sparse Depth, Updated Depth Code,以及准确的IMU Poses。将 Updated Depth Code 放到VAE中,可解码出更加准确的稠密深度。CVAE接收来自VIO的Sparse Depth 和 Updated Code, VIO 中使用CVAE预测出的稠密深度和深度不确定性,因此系统是一个紧耦合的闭环。 图4.CodeVIO在VIO状态估计器中调整Depth Code,并从调整后的Updated Depth Code中解码出调整后的稠密深度 03
在状态估计器中,除了一般的导航状态(包括IMU State, Sliding window中的Poses, 相机内外参等)外,我们还会估计一些关键帧的Depth Code ,并仅仅使用稀疏的测量来有效地更新Depth Code,以调整稠密的深度。我们使用的稀疏测量进行状态更新,包括三种类型:特征点重投影误差更新,特征点的稀疏几何更新(网络预测出的稠密深度图中有特征点的深度值观测),深度图的一致性更新(不同帧中同一点的深度值应该一致)。使用稀疏的测量更新深度码之后,稠密深度的质量可以有大幅度提升(详情见论文的实验部分)。
图5. 使用稀疏测量更新Depth Code之后,解码出的稠密深度误差更小
04
上面提到的稀疏测量中的后两种,即特征点的稀疏几何更新与深度图的一致性更新,都需要调整Depth Code,因此需要稠密深度图对Depth Code的雅可比(即神经网络Decoder的雅可比)。现有的深度学习库中如Tensorflow, Pytorch并没有为计算雅可比矩阵而优化设计,而是依赖于Back propagation进行梯度反传来计算梯度训练网络(这里“梯度”表示单个像素对其他量的雅可比,用雅可比矩阵表示整幅图像对其他量的雅可比)。Back propagation经过链式法则计算,十分的慢,并不适合快速计算出神经网络的雅可比。因此,我们提出使用有限差分的方法计算出神经网络的雅可比,不需要Back propagation,仅需要Decoder网络的一次forward pass即可。下式中给出了对Depth Code (是个向量)中的某个元素 求解雅可比矩阵的过程(我们使用的Depth Code为32维):
为求解整个Depth Code 的雅可比矩阵(维度为 ),我们可以并行地进行Batch inference(使用Batch size 为 Depth Code size ),以加快计算速度。我们使用的基于有限差分的雅可比矩阵的计算方法非常快,在GTX 1080Ti 上只需10ms且精度接近完美, 而Tensorflow需要多于300ms的时间,而Pytorch更慢。另外,我们的系统只使用FEJ [3] (第一估计雅可比),因此对一个关键帧图像只需计算一次神经网络的雅可比即可。 05
CodeVIO 提出了一种新的范式,可以紧耦合地估计压缩后的稠密深度和EKF-VIO。来自于VIO的稀疏深度为CVAE神经网络提供了尺度,并大幅度提高深度预测质量。系统仅使用稀疏的测量即可更新稠密的深度图。此外,论文中还介绍了非常快速的基于有限差分的神经网络压雅可比矩阵计算方法。系统实时运行,可具有很强的泛化性(由于VIO的稀疏特征输入到网络,且在VIO状态估计器中调整优化网络预测的稠密深度图;我们仅在NYUV2数据集上进行网络的训练,而惊奇地发现系统可以在Euroc Mav 数据集上很好地工作)。当然CodeVIO 也有一些需要进一步完善的地方,比如我们只进行局部的dense mapping, 而 globally consistent dense mapping也值得探索。
图6. CodeVIO在神经网络完全未知的Euroc数据集上工作
参考 1.M. Bloesch, J. Czarnowski, R. Clark, S. Leutenegger, and A. J. Davison. “CodeSLAM—learning a compact, optimisable representation for dense visual SLAM”. In: Proceedings of the IEEE conference on computer vision and pattern recognition. 2018, pp. 2560–2568. 2.A. I. Mourikis and S. I. Roumeliotis. “A multi-state constraint Kalman filter for vision-aided inertial navigation”. In: Proceedings 2007 IEEE International Conference on Robotics and Automation. IEEE. 2007, pp. 3565–3572. 3.G. Huang, A. I. Mourikis, and S. I. Roumeliotis. “A First-Estimates Jacobian EKF for Improving SLAM
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“源头活水”历史文章
更多源头活水专栏文章, 请点击文章底部“阅读原文 ”查看
分享、在看,给个三连击呗!